#
# @lc app=leetcode.cn id=152 lang=python3
#
# [152] 乘积最大子数组
#

# @lc code=start
class Solution:
    
    def maxProduct(self, nums: List[int]) -> int:
        """_summary_
        最大 一直都是正数相乘
            正数加偶数个负数相乘
            maxV: 存放到i-1结尾当前的最大乘积
            minV: 存放到i-1结尾的最小乘积(负数), 
            res: 结果
            更新maxV: max(maxV*num, num, num*minV),
                    如果num是正数=maxV*num, 0=0, 负数=num*minV(minV可能是负数,存放的是奇数个负数的乘积)
                    如果minV存放的是正数, 对结果没有影响， 存的是负数就是奇数个负数的乘积
            更新minV: min(minV*num, num, num*t)
                    如果一直是正数， minV存放的是num
                    如果突然来了个负数， 意味之前都是正数， minV存放的是最小的负乘积数,
                    而如果下次是正数,minV越来越小,如果是正数则MaxV就会更新

        Args:
            nums (List[int]): _description_

        Returns:
            int: _description_
        """
        n = len(nums)
        if n == 0:
            return 0
        elif n == 1:
            return nums[0]
        
        minV = nums[0]
        maxV = nums[0]
        res = nums[0]
        for (i, num) in enumerate(nums):
            if i == 0:
                continue
            t = maxV
            maxV = max(maxV*num, num, num*minV)
            minV = min(minV*num, num, num*t)
            res = max(res, maxV)
        return res


# @lc code=end

